package com.media.system.security.service;

import com.media.system.domain.User;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.Set;

/**
 * 用户权限处理
 * 
 * @author Claude
 * @since 2024-01-20
 */
@Service
public class SysPermissionService {

    /**
     * 获取菜单数据权限
     * 
     * @param user 用户信息
     * @return 菜单权限信息
     */
    public Set<String> getMenuPermission(User user) {
        Set<String> perms = new HashSet<>();
        
        // 管理员拥有所有权限
        if (isAdmin(user.getUserId())) {
            perms.add("*:*:*");
        } else {
            // TODO: 根据用户ID查询权限
            // 暂时给普通用户基本权限
            perms.add("system:user:view");
            
            // 媒体文件权限
            perms.add("media:file:upload");
            perms.add("media:file:view");
            perms.add("media:file:edit");
            perms.add("media:file:delete");
            perms.add("media:file:share");
            perms.add("media:file:download");
            
            // 日记权限
            perms.add("diary:post:create");
            perms.add("diary:post:view");
            perms.add("diary:post:edit");
            perms.add("diary:post:delete");
        }
        
        return perms;
    }

    /**
     * 判断用户是否拥有某个权限
     * 
     * @param permissions 权限列表
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermissions(Set<String> permissions, String permission) {
        return permissions.contains("*:*:*") || permissions.contains(permission);
    }

    /**
     * 验证用户是否具备某权限
     * 
     * @param user 用户信息
     * @param permission 权限字符串
     * @return 用户是否具备某权限
     */
    public boolean hasPermissions(User user, String permission) {
        if (isAdmin(user.getUserId())) {
            return true;
        }
        
        Set<String> permissions = getMenuPermission(user);
        return hasPermissions(permissions, permission);
    }

    /**
     * 判断是否为管理员
     * 
     * @param userId 用户ID
     * @return 结果
     */
    public boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }
}